instanceof es usado para determinar si una variable PHP es una instancia de objeto de cierta clase:
Example #1 Uso de instanceof con clases
<?php
class MiClase
{
}
class NoMiClase
{
}
$a = new MiClase;
var_dump($a instanceof MiClase);
var_dump($a instanceof NoMiClase);
?>
El resultado del ejemplo seria:
bool(true) bool(false)
instanceof puede ser usado también para determinar si una variable es una instancia de objeto de una clase que hereda de una clase padre:
Example #2 Uso de instanceof con clases heredadas
<?php
class ClasePadre
{
}
class MiClase extends ClasePadre
{
}
$a = new MiClase;
var_dump($a instanceof MiClase);
var_dump($a instanceof ClasePadre);
?>
El resultado del ejemplo seria:
bool(true) bool(true)
Para chequear si un objeto no es una instancia de una clase, el operador lógico not puede ser usado.
Example #3 Uso de instanceof para chequear si un objeto no es instancia de una clase
<?php
class MiClase
{
}
$a = new MiClase;
var_dump(!($a instanceof stdClass));
?>
El resultado del ejemplo seria:
bool(true)
Por último, instanceof puede ser usado también para determinar si una variable es una instancia de objeto de una clase que implementa una interfaz:
Example #4 Uso de instanceof para una clase
<?php
interface MiInterfaz
{
}
class MiClase implements MiInterfaz
{
}
$a = new MiClase;
var_dump($a instanceof MiClase);
var_dump($a instanceof MiInterfaz);
?>
El resultado del ejemplo seria:
bool(true) bool(true)
Aunque instanceof es usado por lo general con un nombre de clase literal, también puede usarse con otro objeto o una variable tipo cadena:
Example #5 Uso de instanceof con otras variables
<?php
interface MiInterfaz
{
}
class MiClase implements MiInterfaz
{
}
$a = new MiClase;
$b = new MiClase;
$c = 'MiClase';
$d = 'NoMiClase';
var_dump($a instanceof $b); // $b es un objeto de la clase MiClase
var_dump($a instanceof $c); // $c es una cadena 'MiClase'
var_dump($a instanceof $d); // $d es una cadena 'NoMiClase'
?>
El resultado del ejemplo seria:
bool(true) bool(true) bool(false)
Hay algunas trampas comunes de las que hay que tener cuidado. En versiones anteriores a PHP 5.1.0, instanceof llamaría __autoload() si el nombre de clase no existía. Adicionalmente, si la clase no estaba cargada, ocurriría un error fatal. Esto puede ser evitado usando una referencia dinámica de clase, o una variable tipo cadena que contenga el nombre de clase:
Example #6 Evitar búsquedas de nombres de clase y errores fatales con instanceof en PHP 5.0
<?php
$d = 'NoMiClase';
var_dump($a instanceof $d); // no acurre un error fatal aquí
?>
El resultado del ejemplo seria:
bool(false)
El operador instanceof fue introducido en PHP 5. Anteriormente is_a() era usado, pero desde entonces is_a() ha sido marcada como función obsoleta, prefiriéndose el uso de instanceof. Note que a partir de PHP 5.3.0, is_a() ya no es considerada una función obsoleta.
Vea también get_class() e is_a().